package com.huyun.web.concurrency.publish;

import com.huyun.web.concurrency.annoations.NotThreadSafe;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;

/**
 * 发布对象：使一个对象能够被当前范围之外的代码所使用
 * 对象逸出：一种错误的发布情况，当一个对象还没有构造完成时，就使它被其他线程所见
 * 在我们的日常开发中，经常要发布一些对象，比如通过类的非私有方法返回对象的引用，或者通过公有静态变量发布对象
 * <p>
 * 以上代码通过public访问级别发布了类的域，在类的外部任何线程都可以访问这些域，这样发布对象是不安全的，
 * 因为我们无法假设，其他线程不会修改这些域，从而造成类状态的错误。
 */

/**
 * 发布对象
 */
@Slf4j
@NotThreadSafe
public class UnsafePublish {

    private String[] states = {"a", "b", "c"};

    public String[] getStates() {
        return states;
    }

    public static void main(String[] args) {
        UnsafePublish unsafePublish = new UnsafePublish();
        log.info("{}", Arrays.toString(unsafePublish.getStates()));

        unsafePublish.getStates()[0] = "d";
        log.info("{}", Arrays.toString(unsafePublish.getStates()));
    }
}
